使用 MyScale 的向量 SQL 检索器
MyScale 是一个集成的向量数据库。您可以使用 SQL 访问数据库,也可以通过 LangChain 访问。MyScale 可以利用多种数据类型和函数进行过滤。无论您是在扩展数据还是将系统扩展到更广泛的应用,它都将提升您的 LLM 应用性能。
!pip3 install clickhouse-sqlalchemy InstructorEmbedding sentence_transformers openai langchain-experimental
import getpass
from os import environ
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_community.utilities import SQLDatabase
from langchain_experimental.sql.vector_sql import VectorSQLDatabaseChain
from langchain_openai import OpenAI
from sqlalchemy import MetaData, create_engine
# MyScale 数据库连接信息
MYSCALE_HOST = "msc-4a9e710a.us-east-1.aws.staging.myscale.cloud"
MYSCALE_PORT = 443
MYSCALE_USER = "chatdata"
MYSCALE_PASSWORD = "myscale_rocks"
OPENAI_API_KEY = getpass.getpass("OpenAI API Key:")
# 创建数据库引擎
engine = create_engine(
f"clickhouse://{MYSCALE_USER}:{MYSCALE_PASSWORD}@{MYSCALE_HOST}:{MYSCALE_PORT}/default?protocol=https"
)
metadata = MetaData(bind=engine)
environ["OPENAI_API_KEY"] = OPENAI_API_KEY
from langchain_community.embeddings import HuggingFaceInstructEmbeddings
from langchain_experimental.sql.vector_sql import VectorSQLOutputParser
# 创建输出解析器
output_parser = VectorSQLOutputParser.from_embeddings(
model=HuggingFaceInstructEmbeddings(
model_name="hkunlp/instructor-xl", model_kwargs={"device": "cpu"}
)
)
from langchain.callbacks import StdOutCallbackHandler
from langchain_community.utilities.sql_database import SQLDatabase
from langchain_experimental.sql.prompt import MYSCALE_PROMPT
from langchain_experimental.sql.vector_sql import VectorSQLDatabaseChain
from langchain_openai import OpenAI
# 创建向量 SQL 数据库链
chain = VectorSQLDatabaseChain(
llm_chain=LLMChain(
llm=OpenAI(openai_api_key=OPENAI_API_KEY, temperature=0),
prompt=MYSCALE_PROMPT,
),
top_k=10,
return_direct=True,
sql_cmd_parser=output_parser,
database=SQLDatabase(engine, None, metadata),
)
import pandas as pd
# 运行查询并将结果转换为 DataFrame
pd.DataFrame(
chain.run(
"Please give me 10 papers to ask what is PageRank?",
callbacks=[StdOutCallbackHandler()],
)
)
将 SQL 数据库用作检索器
from langchain.chains.qa_with_sources.retrieval import RetrievalQAWithSourcesChain
from langchain_experimental.retrievers.vector_sql_database import (
VectorSQLDatabaseChainRetriever,
)
from langchain_experimental.sql.prompt import MYSCALE_PROMPT
from langchain_experimental.sql.vector_sql import (
VectorSQLDatabaseChain,
VectorSQLRetrieveAllOutputParser,
)
from langchain_openai import ChatOpenAI
# 创建检索所有输出的解析器
output_parser_retrieve_all = VectorSQLRetrieveAllOutputParser.from_embeddings(
output_parser.model
)
# 创建向量 SQL 数据库链
chain = VectorSQLDatabaseChain.from_llm(
llm=OpenAI(openai_api_key=OPENAI_API_KEY, temperature=0),
prompt=MYSCALE_PROMPT,
top_k=10,
return_direct=True,
db=SQLDatabase(engine, None, metadata),
sql_cmd_parser=output_parser_retrieve_all,
native_format=True,
)
# 创建检索器
retriever = VectorSQLDatabaseChainRetriever(
sql_db_chain=chain, page_content_key="abstract"
)
# 创建文档元数据提示模板
document_with_metadata_prompt = PromptTemplate(
input_variables=["page_content", "id", "title", "authors", "pubdate", "categories"],
template="Content:\n\tTitle: {title}\n\tAbstract: {page_content}\n\tAuthors: {authors}\n\tDate of Publication: {pubdate}\n\tCategories: {categories}\nSOURCE: {id}",
)
# 创建检索 QA 链
chain = RetrievalQAWithSourcesChain.from_chain_type(
ChatOpenAI(
model_name="gpt-3.5-turbo-16k", openai_api_key=OPENAI_API_KEY, temperature=0.6
),
retriever=retriever,
chain_type="stuff",
chain_type_kwargs={
"document_prompt": document_with_metadata_prompt,
},
return_source_documents=True,
)
# 运行查询
ans = chain(
"Please give me 10 papers to ask what is PageRank?",
callbacks=[StdOutCallbackHandler()],
)
print(ans["answer"])
总结
这个文件介绍了如何使用 MyScale 向量数据库和 LangChain 库来创建一个向量 SQL 检索器。主要内容包括:
- 设置 MyScale 数据库连接
- 创建向量 SQL 数据库链
- 使用向量 SQL 数据库链进行查询
- 将 SQL 数据库用作检索器
- 创建和使用检索 QA 链
文件中的代码示例展示了如何配置和使用这些组件来执行语义搜索和问答任务。
扩展知识
-
向量数据库: 向量数据库是专门设计用于存储和检索高维向量的数据库系统。它们在机器学习、自然语言处理和推荐系统等领域有广泛应用。
-
语义搜索: 语义搜索是一种基于理解查询和文档含义的搜索方法,而不仅仅是关键词匹配。它通常使用向量表示来捕捉语义信息。
-
LangChain: LangChain 是一个用于开发基于语言模型的应用程序的框架。它提供了多种工具和抽象,简化了复杂 NLP 任务的开发过程。
-
嵌入模型: 嵌入模型用于将文本转换为密集向量表示。这些向量可以用于计算文本之间的语义相似度。
-
检索增强生成 (RAG): 这是一种结合检索系统和生成模型的方法,用于提高大语言模型的性能和准确性。本文件中的检索 QA 链就是 RAG 的一个实现示例。